home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1983-12-22 | 7.4 KB | 301 lines |
- 10 ' *****************
- 20 ' ** LEM **
- 30 ' *****************
- 40 '
- 50 SCREEN 1
- 60 CLS
- 70 KEY OFF
- 80 LOCATE 2,7
- 90 PRINT "* * * OUT ON A LEM * * *
- 100 LOCATE 5,1
- 110 PRINT "A challenging game of skill ...
- 120 LOCATE 7,1
- 130 PRINT "Use the special function keys F1
- 140 PRINT "through F3 to run your left, right,
- 150 PRINT "and vertical thrusters. You are to
- 160 PRINT "land the lunar excursion module (LEM)
- 170 PRINT "as gently and accurately as possible.
- 180 PRINT
- 190 PRINT "Turn a given thruster off by pressing
- 200 PRINT "the same key a second time.
- 210 PRINT
- 220 PRINT "Watch your fuel supply!
- 230 PRINT
- 240 PRINT "If you have fuel left, the onboard
- 250 PRINT "computer will -attempt- to return
- 260 PRINT "you to earth ...
- 270 '
- 280 LOCATE 25,9
- 290 PRINT "Press any key to begin";
- 300 '
- 310 ' Starting point for each landing attempt
- 320 IF LEN(INKEY$) THEN 320
- 330 K$ = INKEY$
- 340 IF K$ = "" THEN 330
- 350 '
- 360 COLOR 0,1
- 370 CLS
- 380 '
- 390 ' Activate engine keys
- 400 ON KEY(1) GOSUB 1990
- 410 ON KEY(2) GOSUB 2030
- 420 ON KEY(3) GOSUB 2070
- 430 KEY (1) ON
- 440 KEY (2) ON
- 450 KEY (3) ON
- 460 '
- 470 ' A different game each second of the hour
- 480 T$ = MID$(TIME$,4,2) + MID$(TIME$,7)
- 490 RANDOMIZE VAL(T$)
- 500 '
- 510 ' Build the space ship image
- 520 LINE (3,1)-(5,5),2,BF
- 530 LINE (2,2)-(6,4),2,BF
- 540 LINE (1,7)-(2,6),3
- 550 LINE (6,6)-(7,7),3
- 560 DIM SHIP(7)
- 570 GET (0,0)-(8,8),SHIP
- 580 '
- 590 ' Build vertical exhaust image
- 600 LINE (9,1)-(11,1)
- 610 DIM EXHAUSTX(1)
- 620 GET (9,1)-(11,1),EXHAUSTX
- 630 '
- 640 ' Build horizontal exhaust image
- 650 LINE (1,9)-(1,12)
- 660 DIM EXHAUSTY(1)
- 670 GET (1,9)-(1,12),EXHAUSTY
- 680 '
- 690 ' Sprinkle a few stars around
- 700 CLS
- 710 FOR I = 1 TO 300
- 720 PSET (320*RND,200*RND)
- 730 NEXT I
- 740 '
- 750 ' Draw the earth
- 760 CIRCLE (277,63),25,1
- 770 PAINT (277,63),1
- 780 DRAW "c3bm272,42r7d1r4l13d1l4r22d1l24g1r23l3d1l20"
- 790 DRAW "r3d1r14l4d1l8c2l3u1l1d2r18e3l1g1l2f1l5d2r4"
- 800 DRAW "l16d1r14d1l15d1r14g1l13d1r13g1l13"
- 810 DRAW "d1r13f2l1h3l3g1l8d1r6g1l4f1r3f1l3f1r6u2l1d1l1"
- 820 DRAW "d2l3r5d1r1g1r13l2u1l7e1r3d3r7l15f1r15f1l16"
- 830 DRAW "g1r21d1l21f1r20g1l18f1r17g1l15"
- 840 DRAW "f1r13d1l13d1r11d1l11d1r9g1l7g1r6g1l4d1r2l5"
- 850 DRAW "bm273,54c1u1e1r1f2"
- 860 DRAW "c3bd2l2bl2bu1l2h1l1bd4l3h1l3h1l2h1l1"
- 870 DRAW "bg5r1f2r1f1r5u1l3"
- 880 DRAW "bm273,79r1f1d1l3h1l1h2u2e3r2e1r9l3h1l4"
- 890 DRAW "bh2e1r4e1r7l3e2r1"
- 900 '
- 910 ' Choose site for landing pad
- 920 XL = 140 + 50 * RND
- 930 YL = 180 - 10 * RND
- 940 '
- 950 ' Create topographical features of moon
- 960 M1 = M2
- 970 M2 = M1 + 37 * RND
- 980 IF M2 > 319 THEN M2 = 319
- 990 H1 = H2
- 1000 H2 = 190 - 70 * RND
- 1010 IF H1 = 0 THEN 990
- 1020 IF M2 < XL - 39 THEN 1050
- 1030 IF M2 > XL + 39 THEN 1050
- 1040 H2 = YL
- 1050 LINE (M1,H1)-(M2,H2),1
- 1060 IF M2 < 319 THEN 960
- 1070 PAINT (0,199),1
- 1080 '
- 1090 ' Draw the landing pad
- 1100 LINE (XL-3,YL)-(XL+3,YL+2),,BF
- 1110 '
- 1120 ' Slightly random starting location for ship
- 1130 SHIPX = 50 * RND
- 1140 SHIPY = 20 * RND
- 1150 '
- 1160 ' Slightly random starting velocity for ship
- 1170 VELX = 7 + RND * 3
- 1180 VELY = 1 + RND
- 1190 '
- 1200 ' Starting conditions
- 1210 PUT (SHIPX,SHIPY),SHIP,XOR
- 1220 FACTOR = 0.1
- 1230 FUEL = 999
- 1240 THRUSTUP = 3 : GOSUB 3000
- 1250 '
- 1260 ' Main flight loop starts here
- 1270 PULSE = PULSE MOD 7 + 1
- 1280 IF PULSE = 1 THEN SOUND 1200-FUEL/5,1
- 1290 IF THRUSTUP < 0 THEN FUEL = FUEL - 9.7
- 1300 IF THRUSTSIDE THEN FUEL = FUEL - 5.3
- 1310 IF FUEL < 0 THEN FUEL = 0
- 1320 IF FUEL > 99 THEN 1460
- 1330 SOUND 99,0
- 1340 IF FUEL > 0 THEN SOUND 400,1
- 1350 IF FUEL > 0 THEN 1460
- 1360 '
- 1370 ' No more fuel left, disengage engines
- 1380 SOUND 2000,1
- 1390 KEY (1) OFF
- 1400 KEY (2) OFF
- 1410 KEY (3) OFF
- 1420 THRUSTUP = 3
- 1430 THRUSTSIDE = 0
- 1440 '
- 1450 ' Compute new velocities and positions
- 1460 VELX = VELX + FACTOR * THRUSTSIDE * 3
- 1470 OLDX = SHIPX
- 1480 SHIPX = SHIPX + FACTOR * VELX * 3
- 1490 VELY = VELY + FACTOR * THRUSTUP
- 1500 OLDY = SHIPY
- 1510 SHIPY = SHIPY + FACTOR * VELY
- 1520 '
- 1530 ' Put exhaust images in view if necessary
- 1540 IF THRUSTSIDE < 0 THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 1
- 1550 IF THRUSTSIDE > 0 THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR : FLGR = 1
- 1560 IF THRUSTUP < 0 THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 1
- 1570 '
- 1580 ' Have we drifted off screen?
- 1590 IF SHIPY < 0 THEN 1910
- 1600 IF SHIPX < 2 THEN 1910
- 1610 IF SHIPX > 308 THEN 1910
- 1620 '
- 1630 ' Erase old ship image via XOR to preserve background
- 1640 PUT (OLDX,OLDY),SHIP,XOR
- 1650 '
- 1660 ' Draw new ship image, XOR onto background
- 1670 PUT (SHIPX,SHIPY),SHIP,XOR
- 1680 '
- 1690 ' Erase the exhaust images if necessary
- 1700 IF FLGL THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 0
- 1710 IF FLGR THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR : FLGR = 0
- 1720 IF FLGU THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 0
- 1730 '
- 1740 ' Skip landing check for awhile if returning to earth
- 1750 IF LAND <= 0 THEN 1800
- 1760 LAND = LAND - 0.07
- 1770 GOTO 1840
- 1780 '
- 1790 ' Are landing pads touching the moon (and not the earth)?
- 1800 IF POINT (SHIPX,SHIPY+8) = 1 AND SHIPY > 85 THEN 2110
- 1810 IF POINT (SHIPX+8,SHIPY+8) = 1 AND SHIPY > 85 THEN 2110
- 1820 '
- 1830 ' Update the fuel supply
- 1840 LOCATE 25,16
- 1850 PRINT USING "FUEL ###";FUEL;
- 1860 '
- 1870 ' Keep on flying
- 1880 GOTO 1270
- 1890 '
- 1900 ' We just drifted off screen
- 1910 CLS
- 1920 LOCATE 12,4
- 1930 IF LAND = 0 THEN PRINT "MISSION ABORTED, RETURN TO EARTH"
- 1940 IF LAND <> 0 THEN PRINT " WELCOME HOME HERO! "
- 1950 IF LAND <> 0 THEN PLAY "L4 DEEEDEF L1 E"
- 1960 RUN 320
- 1970 '
- 1980 ' Subroutine F1 ... left engine control
- 1990 THRUSTSIDE = -(THRUSTSIDE <> 1)
- 2000 RETURN
- 2010 '
- 2020 ' Subroutine F2 ... right engine control
- 2030 THRUSTSIDE = (THRUSTSIDE <> -1)
- 2040 RETURN
- 2050 '
- 2060 ' Subroutine F3 ... vertical engine control
- 2070 THRUSTUP = 7 * (THRUSTUP = 3) - 3 * (THRUSTUP = -7)
- 2080 RETURN
- 2090 '
- 2100 ' We landed! But how did we fare?
- 2110 LOCATE 1,1
- 2120 VEL = ABS(VELX) + ABS(VELY)
- 2130 IF VEL < 4 THEN 2350
- 2140 '
- 2150 ' Disintegrating ship, parts streaking out from crater
- 2160 PRESET (SHIPX+4,SHIPY+8)
- 2170 FOR I = 1 TO VEL * 0.7
- 2180 DELX = 9 * VEL * (RND-0.5)
- 2190 DELY = 7 * VEL * (-RND)
- 2200 DRAW "C2 NM+=DELX;,=DELY;"
- 2210 NEXT I
- 2220 '
- 2230 ' Fast enough to dig new crater?
- 2240 IF VEL < 8 THEN 2300
- 2250 PRT$ = "New crater is #### meters wide ... "
- 2260 PRINT USING PRT$ ; VEL * VEL / 7
- 2270 GOTO 2780
- 2280 '
- 2290 ' Landing was too rough, sorry
- 2300 PRINT "Damaged beyond repair ... "
- 2310 PRINT "Enjoy your stay ! ";
- 2320 GOTO 2780
- 2330 '
- 2340 ' Landed ok, just how well did you do?
- 2350 IF VEL < 3 THEN 2390
- 2360 PRINT "Fairly soft landing "
- 2370 GOTO 2570
- 2380 '
- 2390 IF VEL < 2 THEN 2430
- 2400 PRINT "Nice job! ";
- 2410 GOTO 2570
- 2420 '
- 2430 IF VEL < 1 THEN 2470
- 2440 PRINT "Excellent soft landing!";
- 2450 GOTO 2570
- 2460 '
- 2470 IF SHIPX-XL+4 < 3 THEN 2510
- 2480 PRINT "Superior landing job!";
- 2490 GOTO 2570
- 2500 '
- 2510 PRINT "The President calls with his";
- 2520 LOCATE 2,1
- 2530 PRINT "congratulations on a superb landing!";
- 2540 GOTO 2740
- 2550 '
- 2560 ' Ok, so how close to the landing pad are you?
- 2570 DIS = ABS(SHIPX-XL+4) + ABS(SHIPY-YL+8)
- 2580 LOCATE 2,1
- 2590 IF DIS < 50 THEN 2630
- 2600 PRINT "But you're way out in the boonies!";
- 2610 GOTO 2740
- 2620 '
- 2630 IF DIS < 10 THEN 2670
- 2640 PRINT "But you missed the landing site!";
- 2650 GOTO 2740
- 2660 '
- 2670 IF DIS < 3 THEN 2710
- 2680 PRINT USING "But you missed the spot by ## meters.";DIS
- 2690 GOTO 2740
- 2700 '
- 2710 PRINT "And you landed right on target!";
- 2720 '
- 2730 ' Music for good landings ...
- 2740 PLAY "o4t128mll6cmsc#e-.mlc mse-c#c.mlcmsffl1f"
- 2750 GOTO 2810
- 2760 '
- 2770 ' Music for disastrous landings ...
- 2780 PLAY "mst64l6n3n7n3n7l3n2"
- 2790 '
- 2800 ' Shall we try a return to earth?
- 2810 IF (FUEL <> 0) AND (VEL < 4 ) THEN 2820 ELSE RUN 320
- 2820 LOCATE 1,1
- 2830 PRINT "Earth calling - return home ";
- 2840 LOCATE 2,1
- 2850 PRINT " ";
- 2860 VELX = 0
- 2870 VELY = -1
- 2880 LAND = 1
- 2890 THRUSTUP = -7
- 2900 THRUSTSIDE = 0
- 2910 FOR Z = 1 TO 2000
- 2920 NEXT Z
- 2930 LOCATE 1,1
- 2940 PRINT "LEM computer engaged - returning home ";
- 2950 KEY (1) OFF
- 2960 KEY (2) OFF
- 2970 KEY (3) OFF
- 2980 IF LEN(INKEY$) THEN 2980
- 2990 GOTO 1270
- 3000 IF FUEL > 999 THEN FUEL = 999 : RETURN
-